import axios from "axios"

// 验证是否为blob格式
function blobValidate(data) {
  return data.type !== 'application/json'
}

async function printErrMsg(data) {
  const resText = await data.text();
  const rspObj = JSON.parse(resText);
  const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
  Message.error(errMsg);
}

/** 用a标签下载流文件
 * @param {*} blob 
 * const blob = new Blob([res.data], type)
 * type一般不传
 * { type: 'text/plain' }
 * { type: 'image/png' }
 * 
 * 下载文件
 * <a href="blob:{url}" download="filename.txt">Download File</a>
 * const blob = new Blob(['Hello, World!'], { type: 'text/plain' });
 * const url = URL.createObjectURL(blob);
 * 
 * 展示图片
 * <img src="blob:{url}">
 * const blob = new Blob([arrayBuffer], { type: 'image/png' });
 * const url = URL.createObjectURL(blob);
 * 
 */
export function downloadBlobFromA(blob, name) {
  if ('download' in document.createElement('a')) { // 非IE下载
    let aDom = document.createElement('a') // 创建一个 a 标签
    aDom.download = name // 设置文件名
    let href = URL.createObjectURL(blob) // 将file对象转成 UTF-16 字符串
    aDom.href = href // 放入href
    aDom.style.display = 'none' // 隐藏
    document.body.appendChild(aDom) // 将a标签插入 body
    aDom.click() // 触发 a 标签的点击
    URL.revokeObjectURL(href) // 释放刚才生成的 UTF-16 字符串
    document.body.removeChild(aDom) // 移除刚才插入的 a 标签
  } else { // IE10+下载
    navigator.msSaveBlob(blob, name)
  }
}

// Base64 转 Blob
export function dataURLtoBlob(dataurl) {
  let arr = dataurl.split(','); //分割为数组，分割到第一个逗号
  let mime = arr[0].match(/:(.*?);/)[1]; //获取分割后的base64前缀中的类型
  let bstr = window.atob(arr[1]);
  let n = bstr.length;
  let u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], { type: mime });
}

/**
 * 下载文件
 * @param {*} url 
 * @param {*} data 
 * @param {*} fileName  例如：'分析结果.xlsx'
 * @returns 
 */
export const downloadFile = (url, data, fileName) => {
  return axios({
    method: 'post',
    url,
    data: qs.stringify(data),
    responseType: "blob"
  }).then(res => {
    const isBlob = blobValidate(res.data);
    if (isBlob) {
      const blob = new Blob([res.data])
      downloadBlobFromA(blob, fileName)
    } else {
      printErrMsg(res.data)
    }
  })
}

export default { downloadFile }